package com.huike.clues.service.impl;


import java.util.*;

import com.huike.clues.domain.SysRoleDept;
import com.huike.common.utils.DateUtils;
import com.huike.common.utils.SecurityUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.huike.common.core.domain.entity.SysRole;
import com.huike.common.utils.StringUtils;
import com.huike.common.utils.spring.SpringUtils;
import com.huike.clues.mapper.SysRoleDeptMapper;
import com.huike.clues.mapper.SysRoleMapper;
import com.huike.clues.mapper.SysRoleMenuMapper;
import com.huike.clues.service.ISysRoleService;

import javax.annotation.Resource;

/**
 * 角色 业务层处理
 * 
 * 
 */
@Service
public class SysRoleServiceImpl implements ISysRoleService
{
    @Resource
    private SysRoleMapper sysRoleMapper;
    @Resource
    private SysRoleMenuMapper sysRoleMenuMapper;
    @Resource
    private SysRoleDeptMapper sysRoleDeptMapper;



    /**
     * 查询所有角色
     *
     * @return 角色列表
     */
    @Override
    public List<SysRole> selectRoleAll()
    {
        return SpringUtils.getAopProxy(this).selectRoleList(new SysRole());
    }

    /**
     * 根据条件分页查询角色数据
     *
     * @param role 角色信息
     * @return 角色数据集合信息
     */
    @Override
    public List<SysRole> selectRoleList(SysRole role)
    {
        return sysRoleMapper.selectRoleList(role);
    }

    /**
     * 根据用户ID获取角色选择框列表
     *
     * @param userId 用户ID
     * @return 选中角色ID列表
     */
    @Override
    public List<Integer> selectRoleListByUserId(Long userId)
    {
        return sysRoleMapper.selectRoleListByUserId(userId);
    }

    /**
     * 根据用户ID查询权限
     *
     * @param userId 用户ID
     * @return 权限列表
     */
    @Override
    public Set<String> selectRolePermissionByUserId(Long userId)
    {
        List<SysRole> perms = sysRoleMapper.selectRolePermissionByUserId(userId);
        Set<String> permsSet = new HashSet<>();
        for (SysRole perm : perms)
        {
            if (StringUtils.isNotNull(perm))
            {
                permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(",")));
            }
        }
        return permsSet;
    }

    /**
     * 新增角色
     * @param sysRole
     */
    @Override
    @Transactional(rollbackFor=Exception.class)
    public void insertRole(SysRole sysRole) {
        //公共字段填充
        String username = SecurityUtils.getUsername();
        Date date = DateUtils.getNowDate();
        sysRole.setCreateBy(username);
        sysRole.setUpdateBy(username);
        sysRole.setCreateTime(date);
        sysRole.setUpdateTime(date);
        if(sysRole.getRoleSort() == null){
           Integer count = sysRoleMapper.countRole()+1;
           sysRole.setRoleSort(count.toString());
        }
        //sys_role插入数据
        sysRoleMapper.insert(sysRole);

        //sys_role_dept插入数据
            Long roleId = sysRole.getRoleId();
            Long[] deptIds = sysRole.getDeptIds();
            if(deptIds != null && deptIds.length == 0){
                sysRoleDeptMapper.inserts(deptIds,roleId);
            }
        //sys_role_menu插入数据
            Long[] menuIds = sysRole.getMenuIds();
            if(menuIds != null && menuIds.length != 0){
                sysRoleMenuMapper.inserts(menuIds,roleId);
            }
    }

    @Override
    @Transactional(rollbackFor=Exception.class)
    public void updateRole(SysRole sysRole) {
        //公共字段填充
        String username = SecurityUtils.getUsername();
        Date date = DateUtils.getNowDate();
        sysRole.setUpdateBy(username);
        sysRole.setUpdateTime(date);
        //sys_role修改
        sysRoleMapper.updateById(sysRole);

        //sys_role_dept 先删除再插入数据
        Long[] deptIds = sysRole.getDeptIds();
        Long roleId = sysRole.getRoleId();
        if(deptIds != null || deptIds.length != 0){
            sysRoleDeptMapper.deleteRoleDeptByRoleId(roleId);
            sysRoleDeptMapper.inserts(deptIds,roleId);
        }
        //sys_role_menu 先删除再插入数据
        Long[] menuIds = sysRole.getMenuIds();
        if(menuIds != null || menuIds.length != 0){
            sysRoleMenuMapper.deleteRoleMenuByRoleId(roleId);
            sysRoleMenuMapper.inserts(menuIds,roleId);
        }
    }

    /**
     * 批量删除角色
     * @param roleIds 角色ID
     * @return
     */
    @Override
    @Transactional
    public int deleteRoleByRoleIds(Long[] roleIds) {

        /*for (Long roleId : roleIds) {

        }*/

        //删除该角色与 菜单 的关联
        sysRoleMenuMapper.deleteRoleMenu(roleIds);
        //删除该角色与 部门 的关联
        sysRoleDeptMapper.deleteRoleDept(roleIds);
        int rows = sysRoleMapper.deleteRoleByRoleIds(roleIds);
        return rows;
    }

    /**
     * 根据角色ID查询对应数据
     * @param roleId
     * @return
     */
    @Override
    public SysRole findRoleByRoleId(Long roleId) {
        return sysRoleMapper.findRoleByRoleId(roleId);
    }

    /**
     * 获取角色选择框列表
     * @return
     */
    @Override
    public List<SysRole> optionSelect() {
        //首先创建了一个SysRole对象sysRole，
        SysRole sysRole = new SysRole();

        //List<SysRole> list = roleMapper.selectRoleList(sysRole);
        //return SpringUtils.getAopProxy(list)

        //然后通过SpringUtils.getAopProxy(this)获取当前对象的AOP代理对象，
        //再调用代理对象的selectRoleList方法来查询角色列表，并将结果返回。
        return SpringUtils.getAopProxy(this).selectRoleList(sysRole);


    }

    /**
     * 修改保存角色数据权限信息
     * @param role
     */
    @Override
    @Transactional  //这里要进行事务操作
    public void dateScope(SysRole role) {
        //先更新角色的信息
        sysRoleMapper.updateByCondition(role);
        //再把之前此角色的id与所有部门id绑定的信息全删除了(sys_role_dept表)
        sysRoleDeptMapper.deleteRoleDeptByRoleId(role.getRoleId());

        //把新的部门权限的部门id都和此角色id绑定(用SysRoleDept接收)
        List<SysRoleDept> sysRoleDeptList = new ArrayList<>();
        for (Long deptId : role.getDeptIds()) {
            SysRoleDept srd = new SysRoleDept();
            srd.setDeptId(deptId);
            srd.setRoleId(role.getRoleId());
            sysRoleDeptList.add(srd);
        }
        //再将此角色的id和它所关联的所有部门的id都添加到sys_role_dept表中
        sysRoleDeptMapper.batchRoleDept2(sysRoleDeptList);
    }
}
